//package com.example.garbage;
//
//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
//import com.example.garbage.controller.CandidateController;
//import com.example.garbage.pojo.Buildings;
//import com.example.garbage.pojo.Candidate;
//import com.google.ortools.linearsolver.MPConstraint;
//import com.google.ortools.linearsolver.MPObjective;
//import com.google.ortools.linearsolver.MPSolver;
//import com.google.ortools.linearsolver.MPVariable;
//import lombok.AllArgsConstructor;
//import lombok.Data;
//import lombok.NoArgsConstructor;
//
//import java.util.ArrayList;
//import java.util.List;
//import java.util.stream.Collectors;
//import java.util.stream.IntStream;
//
///**
// * @Author Shunrai
// * @create 2024/4/12 17:03
// * @Version 1.0
// * @Description
// */
//public class virvual {
//
//    /**
//     *
//     * @param numDemandPoints  需求点数量
//     * @param numCandidates 候选服务站数量
//     * @param demands 需求点的需求量
//     * @param capacities 候选服务站的容量
//     * @param distances 需求点和候选服务站之间的距离矩阵
//     * @return
//     */
//    private List<SiteResponse> Siteplan(int numDemandPoints,int numCandidates, double[] demands, int[] capacities,double[][] distances){
//
//        // 创建优化器
//        MPSolver solver = new MPSolver("ServiceStationProblem", MPSolver.OptimizationProblemType.CBC_MIXED_INTEGER_PROGRAMMING);
//
//        // 创建决策变量
//        MPVariable[][] y = new MPVariable[numDemandPoints][numCandidates];
//        MPVariable[] x = new MPVariable[numCandidates];
//        for (int i = 0; i < numCandidates; i++) {
//            x[i] = solver.makeIntVar(0, 1, "x_" + i); // 表示服务站是否被选中
//            for (int j = 0; j < numDemandPoints; j++) {
//                y[j][i] = solver.makeIntVar(0, 1, "y_" + j + "_" + i); // 表示需求点是否由服务站提供服务
//            }
//        }
//
//        // 修改目标函数
//        MPObjective objective = solver.objective();
//        for (int i = 0; i < numCandidates; i++) {
//            objective.setCoefficient(x[i], 0.00001); // 服务站数量系数调整为较小的值
//        }
//        for (int j = 0; j < numDemandPoints; j++) {
//            for (int i = 0; i < numCandidates; i++) {
//                objective.setCoefficient(y[j][i], -distances[j][i]); // 距离系数调整为负的较大的值
//            }
//        }
//        objective.setMinimization();
//        // 创建约束条件
//        for (int j = 0; j < numDemandPoints; j++) {
//            MPConstraint demandConstraint = solver.makeConstraint(1, 1); // 每个需求点只由一个服务站提供服务
//            for (int i = 0; i < numCandidates; i++) {
//                demandConstraint.setCoefficient(y[j][i], 1);
//            }
//        }
//
//        for (int i = 0; i < numCandidates; i++) {
//            MPConstraint capacityConstraint = solver.makeConstraint(0, capacities[i]); // 服务容量约束
//            for (int j = 0; j < numDemandPoints; j++) {
//                capacityConstraint.setCoefficient(y[j][i], demands[j]); // 服务容量 >= 需求量总和
//            }
//        }
//
//        // 服务站地点与需求点之间的距离约束
//        for (int j = 0; j < numDemandPoints; j++) {
//            for (int i = 0; i < numCandidates; i++) {
//                if (distances[j][i] < 300) {
//                    MPConstraint distanceConstraint = solver.makeConstraint(0, 1); // 0-1约束，用于限制距离小于300m
//                    distanceConstraint.setCoefficient(y[j][i], 1);
//                    distanceConstraint.setCoefficient(x[i],  -1);
//                }
//            }
//        }
//        // 求解问题
//        MPSolver.ResultStatus resultStatus = solver.solve();
//        List<SiteResponse> siteResponses = new ArrayList<>();
//        // 输出结果
//        if (resultStatus == MPSolver.ResultStatus.OPTIMAL) {
//            System.out.println("最优解找到！");
////            System.out.println("服务站总数：" + candidatesObjective.value());
//
//            // 输出选择的服务站
//            System.out.println("选择的服务站:");
//            for (int i = 0; i < numCandidates; i++) {
//                if (x[i].solutionValue() > 0) {
//                    System.out.println("服务站 " + i + " 被选中");
//                }
//            }
//
//            // 输出需求点与服务站的分配情况
//            System.out.println("需求点与服务站的分配情况:");
//            for (int j = 0; j < numDemandPoints; j++) {
//                for (int i = 0; i < numCandidates; i++) {
//                    if (y[j][i].solutionValue() > 0.5) {
//                        System.out.println("需求点 " + j + " 被分配给服务站 " + i);
//                        String osmId = buildinglist.get(j).getOsmId();
//                        Integer id = list.get(i).getId();
//                        Double cost = candidateService.getCost(osmId, id);
//                        siteResponses.add(new CandidateController.SiteResponse(osmId,id,cost));
//                    }
//                }
//            }
//        }  else {
//            System.out.println("找不到最优解或结果不满足距离约束。");
//        }
//        return siteResponses;
//    }
//
//    @Data
//    @AllArgsConstructor
//    @NoArgsConstructor
//    static class SiteResponse{
//        private String osm_id;
//        private Integer c_id;
//        private Double cost;
//    }
//}
